#include "list.h"
//创建顺序表
Plist create_list()
{
	Plist L=malloc(sizeof(list));
	if(NULL==L)
	{
		printf("申请空间失败\n");
		return NULL;
	}
	printf("创建成功\n");
	L->len =0;//初始化顺序表长度
	return L;//返回顺序表地址
}
//输入学生信息
void input_list(Plist p)
{
	int n;
	printf("请输入学生个数：");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		printf("请输入第%d个学生的学号：",i+1);
		scanf("%d",&p->data[i].id);
		getchar();
		printf("请输入第%d个学生的姓名：",i+1);
		scanf("%s",p->data[i].name);
		getchar();
		printf("请输入第%d个学生的专业：",i+1);
		scanf("%s",p->data[i].major);
		getchar();
		printf("请输入第%d个学生的年龄：",i+1);
		scanf("%d",&p->data[i].age);
		getchar();
		p->len++;//计数器
	}
}
//输出学生信息
void output_list(Plist p)
{
	for(int i=0;i<p->len;i++)
		printf("第%2d位学生,学号:%8d,姓名:%8s,专业:%8s,年龄:%2d\n"
				,i+1
				,p->data[i].id
				,p->data[i].name
				,p->data[i].major
				,p->data[i].age);
}
/**************************增删改查*****************************/
//判满
int full(Plist p)
{
	if(p->len >=MAX)
		return -1;
	return 0;
}
//判空
int empty(Plist p)
{
	if(p->len == 0)
		return -1;
	return 0;
}
//插入
int insert_stu(Plist p,int n,student test)
{
	int sub=n-1;
	if(sub<0 || sub>p->len || p==NULL || full(p))
	{
		printf("插入失败\n");
		return -1;
	}
	for(int i=p->len-1;i>=sub;i--)
		p->data[i+1]=p->data[i];
	p->data[sub]=test;
	p->len++;
	printf("插入成功\n");
	return 0;
}
//删除
int delete_stu(Plist p,int n)
{
	int sub=n-1;
	if(sub<0 || sub>p->len || p==NULL || empty(p))
	{
		printf("删除失败\n");
		return -1;
	}
	for(int i=sub;i<p->len;i++)
		p->data[i]=p->data[i+1];
	p->len--;
	printf("删除成功\n");
	return 0;
}
//查找
int inserach_stu(Plist p,int n)
{
	int sub=n-1;
	if(sub<0 || sub>p->len || p==NULL || empty(p))
	{
		printf("查找失败\n");
		return -1;
	}
	printf("该学生存在\n");
	printf("第%2d位学生,学号:%4d,姓名:%4s,专业:%4s,年龄:%2d\n"
			,n
			,p->data[sub].id
			,p->data[sub].name
			,p->data[sub].major
			,p->data[sub].age);
	return 0;
}
//修改
int change_stu(Plist p,int n,student test1)
{
	int sub=n-1;
	if(sub<0 || sub>p->len-1 || p==NULL || empty(p))
	{
		printf("修改失败\n");
		return -1;
	}
	p->data[sub]=test1;
	printf("修改成功\n");
	return 0;
}
//表头插入
int insert_front_stu(Plist p,student test1)
{
	if(p==NULL||full(p))
	{
		printf("插入失败\n");
		return -1;
	}
	for(int i=p->len-1;i>=0;i--)
		p->data[i+1]=p->data[i];
	p->data[0]=test1;
	p->len++;
	printf("表头插入成功\n");
	return 0;
}
//表尾插入
int insert_rear_stu(Plist p,student test1)
{
	if(p==NULL || full(p))
	{
		printf("表尾插入失败\n");
		return -1;
	}
	p->data[p->len]=test1;
	p->len++;
	printf("表尾插入成功\n");
	return 0;
}
//表头删除
int delete_front_stu(Plist p)
{
	if(p==NULL || empty(p))
	{
		printf("表头删除失败\n");
		return -1;
	}
	for(int i=0;i<p->len-1;i++)
		p->data[i]=p->data[i+1];
	p->len--;
	printf("表头删除成功\n");
	return 0;
}
//表尾删除
int delete_rear_stu(Plist p)
{
	if(p==NULL || empty(p))
	{
		printf("表尾删除失败\n");
		return -1;
	}
	//p->data[p->len-1]=p->data[p->len];
	p->len--;
	printf("表尾删除成功\n");
	return 0;
}
//去重
int delete_repetition_stu(Plist p)
{
	if(p==NULL || empty(p))
	{
		printf("去重失败\n");
		return -1;
	}
	for(int i=0;i<p->len-1;i++)
	{
		for(int m=i+1;m<p->len;m++)
		{
			if(p->data[i].id == p->data[m].id)
			{
				delete_stu(p,m+1);
				//p->len--;
				m--;
			}
		}
	}
	printf("去重成功\n");
	return 0;
}
//按照姓名查找返回位置
int check_stu(Plist p)
{
	char test1[20];
	int n=0;
	printf("请输入要查找的姓名：");
	scanf("%s",test1);
	if(NULL==p || empty(p))
	{
		printf("查找失败\n");
		return -1;
	}
	for(int i=0;i<p->len;i++)
	{
		if(0==strcmp(p->data[i].name,test1))
			printf("查找成功，下标为：%d\n",i),n++;
	}
	if(n==0)
	{
		printf("查找失败，不存在该学生\n");
		return -1;
	}
	printf("查找完成\n");
	return 0;
}
//按学号排序
int buble_sort(Plist p)
{
	student test1;
	int flag;
	for(int i=0;i<p->len-1;i++)
	{
		flag=999;
		for(int j=0;j<p->len-1-i;j++)
		{
			if(p->data[j].id>p->data[j+1].id)
			{
				flag=888;
				test1=p->data[j];
				p->data[j]=p->data[j+1];
				p->data[j+1]=test1;
			}
		}
		if(999==flag)break;
	}
	printf("排序完成\n");
	return 0;
}
//按学号二分查找
int binary_stu(Plist p)
{
	int m;
	printf("请输入要查找的学号：");
	scanf("%d",&m);
	int l=0,
		r=p->len-1,
		mid;
	while(l<=r)
	{
		mid=l+(r-l)/2;
		if(m<p->data[mid].id)
			r=mid-1;
		else if(m>p->data[mid].id)
			l=mid+1;
		else
			break;
	}
	if(m==p->data[mid].id)
	printf("查找成功,学号:%4d,姓名:%4s,专业:%4s,年龄:%2d\n"
			,p->data[mid].id
			,p->data[mid].name
			,p->data[mid].major
			,p->data[mid].age);
	return 0;
}
//按年龄查找并删除
int find_age_delete(Plist p)
{
	int m,sub=0;
	printf("请输入删除的学生的年龄：");
	scanf("%d",&m);
	for(int i=0;i<p->len;i++)
	{
		if(m==p->data[i].age)
		{
			sub++;
			printf("查找成功,\n学号:%4d,姓名:%4s,专业:%4s,年龄:%2d\n"
			,p->data[i].id
			,p->data[i].name
			,p->data[i].major
			,p->data[i].age);
			delete_stu(p,i+1);
			i--;
		}
	}
	if(0==sub) printf("查找失败，无该年龄信息学生\n");
	else
	printf("全部查找并删除完成\n");
	return 0;
}
//按照学号查找并修改
int find_id_change(Plist p);
{
	//
	buble_sort(p);

	return 0;
}
//释放空间
int free_stu(Plist p)
{
	free(p);
	p==NULL;
	return 0;
}
